import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class DigitalCircle {
    public static void main(String[] args) {
        List<Long> caculateResults = new ArrayList<>();
        long num = generateNum(9999999);
//        caculateResults.add(num);
        System.out.println("原始数为:"+num);
        while(!caculateResults.contains(num)){
            caculateResults.add(num);
            num = caculateBigSubSmall(num);
        }
        caculateResults.add(num);
        for(Long lon: caculateResults){
            System.out.println(lon);
        }


    }

    public static long caculateBigSubSmall(long num){
        List<Integer> intList = convertToDiditalList(num);
        intList.sort(null);
        long smallNum = listToNumber(intList);
        System.out.println("最小为："+smallNum);
        Collections.reverse(intList);
        long bigNum = listToNumber(intList);
        System.out.println("最大为："+bigNum);
        System.out.println("相差为："+(bigNum - smallNum));
        return (bigNum - smallNum);
    }

    public static long generateNum(long numberOfDigits){
        Random rand = new Random();
        return Math.abs(rand.nextLong(numberOfDigits));
    }

    public static List<Integer> convertToDiditalList(long lon){
        List<Integer> digits = new ArrayList<>();
//        System.out.println("打印list");
        // 当number不为0时，循环继续
        while (lon != 0) {
            // 使用%运算符获取number的最后一位数字
            long digit = lon % 10;
            // 将数字添加到列表中
            digits.add(0, (int)digit); // 使用add(0, ...)将新元素添加到列表的开始处
            // 使用/运算符移除number的最后一位数字
            lon /= 10;
//            System.out.print(digit);
        }
//        System.out.print("\n");

        return digits;
    }

    public static long listToNumber(List<Integer> digits) {
        long number = 0;
        long powerOfTen = 1; // 10的幂次，初始化为1（对应最低位）

        // 从列表的末尾开始遍历，因为列表的末尾是原数字的最低位
        for (int i = digits.size() - 1; i >= 0; i--) {
            int digit = digits.get(i);
            // 将当前数字乘以相应的10的幂次，并累加到number中
            number += digit * powerOfTen;
            // 更新10的幂次，为下一次迭代准备
            powerOfTen *= 10;
        }

        return number;
    }
}
